package com.sg.fileService.util;

import java.io.File;

import org.apache.commons.lang3.StringUtils;
import org.joda.time.DateTime;

import com.sg.fileService.common.FileUploadException;
import com.sg.fileService.common.FileUploadTools;
import com.sg.fileService.entity.FileTypeConfig;
import com.sg.fileService.model.EnumSize;
import com.sg.fileService.model.FilePath;
import com.sg.fileService.config.Property;

/**
 * 生成文件存储的路径，和获取文件的路径
 *
 * @author xzk
 * @version 1.0
 * @date 20180224
 */
public class PathCreator {
	private PathCreator() {
		
	}
    /**
     * 根据文件名称获取文件路径
     *
     * @param fileName
     * @return
     * @throws FileUploadException
     */
    public static String getFilePath(String fileName) throws FileUploadException {
        FileTypeConfig config = FileUploadTools.getTypeConfig0(fileName);
        return Property.BASE_PATH + File.separator + config.getTypePath();
    }

    public static String getFilePathByRealTivePath(String realTivePath) {
        return Property.BASE_PATH + PathCreator.fomartPath(realTivePath);
    }

    /**
     * 获取文件路径
     *
     * @param proPath    保存文件对应的项目名称
     * @param fileConfig 文件类型配置
     * @param lastPath   保存文件的最后一个文件夹的名称分类 o,l,s,m等
     * @param fileName   文件的名称通过算法生成
     * @return
     */
    public static FilePath getFilePath(String proPath, FileTypeConfig fileConfig, String lastPath, String fileName) {
        FilePath filePath = new FilePath();

        fileName = getFileName(fileName, fileConfig);

        String rootPath = StringUtils.replace(Property.BASE_PATH, "/", File.separator);

        //定义上传路径  /项目名称/日期（yyyyMM）/文件类型/文件格式/文件名称
        StringBuilder realTivePath = new StringBuilder()
                                            .append(File.separator).append(proPath)
                                            .append(File.separator).append(new DateTime().toString(Property.DATEPATH_EXPRESSION))
                                            .append(File.separator).append(fileConfig.getTypePath())
                                            .append(File.separator).append(lastPath)
                                            .append(File.separator).append(fileName);

        filePath.setRootPath(rootPath);
        filePath.setRealTivePath(realTivePath.toString());
        filePath.setAllPath(rootPath + realTivePath);
        filePath.setFileName(fileName);

        return filePath;
    }

    /**
     * 根据原存储路径的最后一个文件夹名称，获取目标文件存储路径
     *
     * @param sourcePath 原存储路径
     * @param size       文件大小枚举
     * @return
     */
    public static String getTargetFilePath(String sourcePath, EnumSize size){
        return doGetTargetFilePath(sourcePath,getLastPathName(size));
    }

    /**
     * 根据原存储路径的最后一个文件夹名称，获取目标文件存储路径
     *
     * @param sourcePath   原存储路径
     * @param fileSizeType 文件大小类型字符串
     * @return
     */
    public static String getTargetFilePath(String sourcePath, String fileSizeType){
        return doGetTargetFilePath(sourcePath,getLastPathName(fileSizeType));
    }
    /**
     * 根据原存储路径的最后一个文件夹名称，获取目标文件存储路径
     *
     * @param sourcePath   原存储路径
     * @param lastPathName     文件路径中最后一个文件夹的名称
     * @return
     */
    private static String doGetTargetFilePath(String sourcePath, String lastPathName){
        //替换路径
        String replacePath = File.separator + lastPathName + File.separator;
        //目标路径
        String targetPath = StringUtils.replace(sourcePath, File.separator + Property.LAST_PATH_O + File.separator, replacePath);
        //判断路径是否已创建
        File file = new File(targetPath.substring(0, targetPath.lastIndexOf(File.separator)));
        if (!file.exists()) {
            file.mkdirs();
        }
        return targetPath;
    }


    /**
     * 根据size枚举获取在文件最后一个文件夹名称
     *
     * @param size 文件类型
     * @return
     */
    public static String getLastPathName(EnumSize size) {
        String lastPath = "";
        if (EnumSize.MINI_SIZE == size) {
            lastPath = Property.LAST_PATH_S;
        } else if (EnumSize.MIDDLE_SIZE == size) {
            lastPath = Property.LAST_PATH_M;
        } else if (EnumSize.BIG_SIZE == size) {
            lastPath = Property.LAST_PATH_L;
        } else if (EnumSize.BREVIARY_IMG == size) {
            lastPath = Property.LAST_PATH_T;
        }
        return lastPath;
    }

    /**
     * 根据文件类型字符串获取在文件最后一个文件夹名称
     *
     * @param fileSizeType 文件类型
     * @return
     */
    public static String getLastPathName(String fileSizeType) {
        String lastPath = "";
        if (Property.LAST_PATH_S.equals(fileSizeType)) {
            lastPath = Property.LAST_PATH_S;
        } else if (Property.LAST_PATH_M.equals(fileSizeType)) {
            lastPath = Property.LAST_PATH_M;
        } else if (Property.LAST_PATH_L.equals(fileSizeType)) {
            lastPath = Property.LAST_PATH_L;
        } else if (Property.LAST_PATH_T.equals(fileSizeType)) {
            lastPath = Property.LAST_PATH_T;
        } else if (Property.LAST_PATH_O.equals(fileSizeType) || StringUtils.isEmpty(fileSizeType)) {
            lastPath = Property.LAST_PATH_O;
        }
        return lastPath;
    }

    /*
     * 获取文件名称
     */
    public static String getFileName(String fileName, FileTypeConfig fileConfig) {
        //判断是否执行重命名
        if (fileConfig.getRenameEnabled()) {
            //通过雪花算法生成的文件名
            fileName = FileUploadTools.doRename(fileName);
        }

        return fileName;
    }

    /**
     * 修改文件后缀
     *
     * @param sourcePath 源文件路径
     * @param suffix     后缀字符
     * @return
     */
    public static String modifyFileSuffix(String sourcePath, String suffix) {
        //截取后缀
        StringBuilder sb = new StringBuilder(StringUtils.substring(sourcePath, 0, StringUtils.lastIndexOf(sourcePath, ".") + 1));
        //拼接后缀为suffix
        return sb.append(suffix).toString();
    }

    /**
     * 格式化路径中的斜杠
     *
     * @param path 文件路径
     * @return
     */
    public static String fomartPath(String path) {
        path = StringUtils.replace(path, "/", File.separator);
        path = StringUtils.replace(path, "\\\\", File.separator);
        return path;
    }
}
